﻿using System;
using System.Collections.Generic;
using System.Data.Entity.Validation;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ToqueDeDarsena.Models;
using TrabajoFinal.Models;
using WebMatrix.WebData;

namespace ToqueDeDarsena.Controllers
{
    [Authorize(Roles="Operario")]
    public class DarsenaController : Controller
    {
        //  Es un ABM para los empleados de la terminal, en el cual cargan los arribos de los micros.
        //  La informacion que ellos cargan es: codigo de la empresa y codigo de la localidad.
        //  Se debe guardar automaticamente la fecha y hora en la que se hizo la carga
        //
        //  Cuando se carga el codigo de la empresa o de la localidad, aparece automaticamente el nombre asociado, utilizando ajax

        ContextoDatos db = new ContextoDatos(); //  Crea un nuevo contexto de datos.
        //
        // GET: /Darsena/



        public ActionResult Index()
        {
            //  Index():
            //
            //  Devuelve la vista Index y le pasa al modelo de la misma la lista de darsenas.
            Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
            dict["0"] = db.Darsenas.ToList();
            dict["1"] = Darsenas.listaDarsenas;
            return View(dict);
        }

        public ActionResult AgregarAjax(int empresa, int localidad, string nroInterno, int codDarsena)
        {
            //  AgregarAjax(int, int, string):
            //
            //  Crea una nueva instancia de darsena, inicializándola con la información ingresada por el usuario.
            //  La fecha de la instancia es la actual, que se genera automáticamente con DateTime.Now.
            //
            //  Luego se genera un Dictionary<string, dynamic> dict con los siguientes valores:
            //      dict[0]: la instancia de darsena.
            //      dict[1]: un string que contiene la ruta de la acción "Modificar".
            //      dict[2]: la fecha actual, convertida a string.
            //      dict[3]: un string que contiene la expresión HTML para generar un botón.
            //
            //  El método devuelve este diccionario en un Json.

            Darsena darsena = null;
            Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
            if (ChequearDatos(empresa, localidad))
            {
                darsena = new Darsena();
                Empresa emp = db.Empresas.Find(empresa);
                Localidad loc = db.Localidades.Find(localidad);
                Usuario user = db.Usuarios.Find(WebSecurity.CurrentUserId);
                DateTime date = DateTime.Now;
                darsena.empresa = emp;
                darsena.localidad = loc;
                darsena.nroInterno = nroInterno;
                darsena.fecha = date;
                darsena.usuario = user;
                db.Darsenas.Add(darsena);
                db.SaveChanges();

                String fecha = darsena.fecha.ToString();
                String urlMod = Url.Action("Modificar", "Darsena", new { id = darsena.id });
                String botonDel = "<td><button class='borrar' value=" + darsena.id + ">X</button></td>";
                

                dict.Add("1", urlMod);
                dict.Add("2", fecha);
                dict.Add("3", botonDel);

                Darsenas.Dar d = new Darsenas.Dar();
                d.empresa = db.Empresas.Find(empresa);
                d.localidad = db.Localidades.Find(localidad);
                Darsenas.listaDarsenas[codDarsena-1] = d;
                db.DarsenasTabla.Find(codDarsena).Destino = d.localidad;
                db.DarsenasTabla.Find(codDarsena).empresa = d.empresa;
                db.SaveChanges();

                
            }
                dict.Add("0", darsena);

                
                

            return Json(dict);
        }

        public ActionResult BorrarAjax(int id)
        {
            //  BorrarAjax(int):
            //  
            //  Busca en la base de datos la darsena que tenga el id indicado.
            //  Luego la borra de la base de datos.
            //
            //  Devuelve el string "Elemento borrado" para indicar que la operación fue exitosa.

            Darsena darsena = db.Darsenas.Find(id);
            db.Darsenas.Remove(darsena);
            db.SaveChanges();

            return Json("Elemento borrado");
        }

        public ActionResult Modificar(int id)
        {
            //  Modificar(înt)
            //
            //  Devuelve la vista Modificar y le pasa al modelo de la misma la lista de darsenas.
            if (db.Darsenas.Find(id).usuario.UserId == WebSecurity.CurrentUserId)
                return View(model: db.Darsenas.Find(id));
            else
                return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult Modificar(int id, int empresa, int localidad, string nroInterno)
        {
            //  Modificar(int, int, int, string)
            //
            //  Busca la darsena, empresa y localidad indicadas en sus tablas correspondientes, 
            //  y actualiza la información de la darsena con la empresa, localidad y nroInterno indicados.
            //
            //  Devuelve la vista Index con la lista de darsenas como modelo.

            if (ChequearDatos(empresa, localidad))
            {
                Darsena darsena = db.Darsenas.Find(id);
                Empresa emp = db.Empresas.Find(empresa);
                Localidad loc = db.Localidades.Find(localidad);
                darsena.empresa = emp;
                darsena.localidad = loc;
                darsena.nroInterno = nroInterno;
                db.SaveChanges();
                return View("Index", model: db.Darsenas.ToList());
            }
            else 
            {
                return View(model: db.Darsenas.Find(id));
            }

        }

        public ActionResult ChequearEmpresaAjax(int empresaId)
        {
            //  ChequearEmpresaAjax(int):
            //
            //  Si el código de empresa es válido, devuelve el nombre de la misma.
            //  Sino, devuelve el string "Empresa Invalida".

            string resultado = "Empresa invalida";

            if (db.Empresas.Find(empresaId) != null)
                resultado = db.Empresas.Find(empresaId).nombre;

            return Json(resultado, JsonRequestBehavior.AllowGet); //Retorna el objeto por Ajax
        }

        public ActionResult ChequearLocalidadAjax(int localidadId)
        {
            //  ChequearLocalidadAjax(int):
            //
            //  Si el código de localidad es válido, devuelve el nombre de la misma.
            //  Sino, devuelve el string "Localidad Invalida".

            string resultado = "Localidad invalida";

            if (db.Localidades.Find(localidadId) != null)
                resultado = db.Localidades.Find(localidadId).nombre;

            return Json(resultado, JsonRequestBehavior.AllowGet); //Retorna el objeto por Ajax
        }

        public bool ChequearDatos(int empresa, int localidad)
        {
            if ((db.Empresas.Find(empresa) == null) || (db.Localidades.Find(localidad) == null))
                return false;
            else
                return true;
        }
       
    }
}

